//
//  CZOauthViewController.swift
//  czbkiosweibo5
//
//  Created by zhangping on 15/10/13.
//  Copyright © 2015年 zhangping. All rights reserved.
//

import UIKit
import SVProgressHUD

/*
    OC能调用swift方法,是因为swift方法的前面有 @objc,只要不是private的方法,系统默认会加上@objc
*/

class CZOauthViewController: UIViewController, UIWebViewDelegate {
    
    /// 在这里赋值给view. 大小不用我们设置
    override func loadView() {
        view = webView
        webView.delegate = self
        setupNavigationItem()
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        
        // 设置标题
        title = "新浪微博登录"
        
        // 加载授权请求界面
        let request = NSURLRequest(URL: CZNetworkTool.sharedInstance.oauthURL())
        webView.loadRequest(request)
        
        // 如果控制器的view.backgroundColor = nil modal的时候会出现透明
//        view.backgroundColor = UIColor.whiteColor()
    }
    
    // MARK: - 私有方法
    
    /**
    设置导航栏右边取消按钮
    */
    private func setupNavigationItem() {
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "取消", style: UIBarButtonItemStyle.Plain, target: self, action: "close")
    }
    
    /**
    关闭Oauth授权控制器. 统一关闭入口
    */
    @objc private func close() {
        SVProgressHUD.dismiss()
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    // MARK: - 代理方法
    func webViewDidStartLoad(webView: UIWebView) {
        SVProgressHUD.showWithStatus("正在加载...", maskType: SVProgressHUDMaskType.Black)
    }
    
    func webViewDidFinishLoad(webView: UIWebView) {
        SVProgressHUD.dismiss()
    }
    
    /*
        用户授权界面
            1.点击取消: "h ttp://www.baidu.com/?error_uri=%2Foauth2%2Fauthorize&error=access_denied&error_description=user%20denied%20your%20request.&error_code=21330"
            2.点击确定:h ttp://www.baidu.com/?code=bed8c64082be1c33437cece317dcdf92
            分析:
                1.点击取消和确定都会加载回调地址.
                2.点击确定后面的参数是:code=bed8c64082be1c33437cece317dcdf92
                3.点击取消没有:code=参数
            可以通过有没有code=来确定点击的是哪个按钮
    */
    func webView(webView: UIWebView, shouldStartLoadWithRequest request: NSURLRequest, navigationType: UIWebViewNavigationType) -> Bool {
        let urlString = request.URL!.absoluteString
        print("urlString: \(urlString)")
        
        // 如果加载的不是回调地址,直接放行
        if !urlString.hasPrefix(CZNetworkTool.sharedInstance.redirect_uri) {
            return true
        }
        
        // 能到这里来说明是回调地址
        // 判断点击的是 确定 还是 取消
        // URL的query是get请求?号后面的内容
        if let query = request.URL?.query {
            let codeString = "code="
            
            // 以code开头,说明点击的是确定按钮
            if query.hasPrefix(codeString) {
                // 获取code的值
                let code = (query as NSString).substringFromIndex(codeString.characters.count)
                loadAccessToken(code)
            } else {
                // 点击的是取消按钮
                close()
            }
        }
        
        return false
    }
    
    // 加载AccessToken
    func loadAccessToken(code: String) {
        // 调用网络工具类的loadAccessToken
        // 调用的时候想获取到网络请求的结果
        CZNetworkTool.sharedInstance.loadAccessToken(code) { (result, error) -> () in
            // 判断错误, 模拟出错,看看逻辑是否合理
            if error != nil || result == nil {
                self.netError("您的网络不给力")
                return
            }
            
            // 加载AccessToken数据成功, 保存起来,这样下次进入程序就不用在去网络获取AccessToken了.
            // 1.获取token及其他信息,转成模型
            // 2.异步加载用户信息
            // 3.保存用户信息
            let userAccount = CZUserAccount(dict: result!)
            print("userAccount1: \(userAccount)")
            userAccount.loadUserInfo({ (error) -> () in
                if error != nil {
                    self.netError("加载用户数据出错")
                    return
                }
                
                // 加载用户信息成功,关闭Oauth控制器
                self.close()
//                print("userAccount2: \(userAccount)")
//                (UIApplication.sharedApplication().delegate as? AppDelegate)?.switchViewController(false)
                AppDelegate.switchViewController(false)
            })
            // 保存账户信息
//            userAccount.saveAccount()
        }
    }
    
    private func netError(message: String) {
        SVProgressHUD.showErrorWithStatus(message, maskType: SVProgressHUDMaskType.Black)
        
        // 延时1秒钟关闭
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), { () -> Void in
            self.close()
        })
    }
    
    // MARK: - 懒加载webView
    private lazy var webView: UIWebView = UIWebView()
}
